package cn.edu.ctgu;

import java.time.Duration;
import java.time.LocalDateTime;

/**.
 * 该类是一个工具类，用于计算两个时间点之间的通话时长（以分钟为单位）。
 */
public final class CallDurationCalculator {
    // 使用枚举实现单例模式
    public static final CallDurationCalculator INSTANCE = new CallDurationCalculator();

    // 隐藏公共构造器，防止实例化工具类，将构造器设置为私有
    private CallDurationCalculator() {
    }

    /**.
     * 获取 CallDurationCalculator 类的单例实例。
     *
     * @return CallDurationCalculator 类的实例
     */
    public static CallDurationCalculator getInstance() {
        return INSTANCE;
    }
    // 定义常量来避免魔术数字
    private static final int MAX_CALL_HOURS = 30;
    private static final double MINUTES_IN_HOUR = 60.0;

    /**.
     * 计算两个时间点之间的通话时长（以分钟为单位）。
     *
     * @param start 通话开始时间
     * @param end   通话结束时间
     * @return 通话时长（以分钟为单位），向上取整
     * @throws IllegalArgumentException 如果开始时间晚于结束时间或者通话时长超过 30 小时
     */
    public static long calculateDurationInMinutes(LocalDateTime start, LocalDateTime end) {
        if (start.isAfter(end)) {
            throw new IllegalArgumentException("开始时间不能晚于结束时间");
        }
        Duration duration = Duration.between(start, end);
        if (duration.toHours() > MAX_CALL_HOURS) {
            throw new IllegalArgumentException("通话时长不能超过 " + MAX_CALL_HOURS + " 小时");
        }
        return (long) Math.ceil(duration.getSeconds() / MINUTES_IN_HOUR);
    }
}